package com.xiang.handler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * outBandHandler 作用：
 *  1、响应数据的包装、压缩、加密等通用功能。
 */
@Slf4j
public class ServerOutbandHandler1  extends ChannelOutboundHandlerAdapter {
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        super.write(ctx, msg, promise);
        //执行顺序： head--> inband1 --> inband2 --> ...-> tail -->  outband1 --> ...-->head
        // 此处msg为 inband1 channel写入的数据，注意：不要读出，读出后ByteBuf向后传递则为空
        ByteBuf byteBuf = (ByteBuf)msg;
        log.info("ServerOutbandHandler1 write 拦截到写出去的数据为：{}", byteBuf.toString(Charset.defaultCharset()));

        //注意： outband中使用ctx write()追加数据  --》从当前Handler往前找outbandhand , 若使用channel.write() 则从tailHandler往前找outbandHandler执行
        ByteBuf buffer = ctx.alloc().buffer();
        buffer.writeBytes("append".getBytes(StandardCharsets.UTF_8));
        ctx.writeAndFlush(buffer);

        //不能使用 --> 死循环 异常！
//        ctx.channel().write("xxxx");

    }
}
